# 前端性能监控

2019.02.24

前端性能监控分为两种方式,一种叫做合成监控(Synthetic Monitoring,SYN),另一种是真实用户监控(Real User Monitoring,RUM)。

# 合成监控

什么叫合成监控?就是在一个模拟场景里,去提交一个需要做性能审计的页面,通过一系列的工具、规则去运行你的页面,提取一些性能指标,得出一个审计报告。

常见的工具有 Google 的 Lighthouse,webpagetest,pagespeed 等。

当然其实业界对于 Lighthouse 也是评价有褒有贬,因为 Google 借助这个看似中立的性能评审工具也是在推行它的一些技术的方案。 比如你的页面如果没有支持 PWA 评分就不会很高。

  • 合成监控的优缺点
优点 缺点
实现简单 无法还原全部真实场景
能采集到丰富的数据,如硬件指标或瀑布图 登录等场景需要额外解决
不影响真实用户的访问性能 单次数据不够稳定
可以提供页面加载幻灯片等可视化分析途径 数据量较小,无法发挥更大价值

# 真实用户监控

所谓真实用户监控,就是用户在我们的页面访问之后就会产生各种各样的性能指标,之后会将这些性能指标上传的我们的日志服务器上,进行数据的提起清洗加工,最后在我们的监控平台上进行展示和分析的一个过程。

  • 真实用户监控的优缺点
优点 缺点
无需配置模拟条件,完全还原真实场景 一定程度影响真实用户的访问性能及流量消耗
不存在登录等需要额外解决的场景 无法采集硬件相关指标
数据样本足够庞大,可以减少统计误差 受传输限制无法采集完整的资源加载瀑布图
新年数据可与其它数据关联,产生更大价值 无法可视化展示加载过程

# 对比

对比项 合成监控 真实用户监控
实现难度及成本 较低 较高
采集数据丰富度 丰富 基础
数据样本量 较小 大(视业务体量)
适合场景 团队自由业务,对性能做定性分析,或配合 CI 做小数据量的监控分析 作为中台产品支持前台业务,对性能做定量分析,结合业务数据进行深度挖掘

# 方案

在真实用户性能数据采集时,要关注四个方面的东西:

  • 使用标准的 API

  • 定义合适的指标

  • 采集正确的数据

  • 上报关联的维度

# 使用标准的 API

之前大家都使用一个叫 performance.timing,来做性能监控。但这个 API 已经“废弃”了。为什么会被废弃?因为 W3C 给我们提供了更全面、更强大的一个性能分析矩阵,比单一的 performance.timing 更加强大,能帮助我们从各个方面分析前端页面性能。

采集性能数据时先抹平 Navigation Timing spec 差异,优先使用 PerformanceTimeline API(在复杂场景,亦可考虑优先使用 PerformanceObserver)。

# 定义合适的指标

First Meaningful Paint,首次有效渲染时长,这个指标最早是由 Google 提出的,它的一个核心的想法是渲染并不一定代表着用户看到了主要内容,Load 也不一定代表用户看到主要内容,那用户什么时候能够看到主要内容呢?我们假设当一个网页的 DOM 结构发生剧烈的变化的时候,就是这个网页主要内容出现的时候,那么在这样的一个时间点上,就是用户看到主要内容的一个时间点。

它的优点是相对校准的估算出内容渲染时间,贴近用户感知。但缺点是无原生 API 支持,算法推导时 DOM 节点不含权重。

# 怎样采集正确的数据?

上报页⾯加载开始时间,以及后续各时间点相对增量,在数据端进行阶段清洗和异常处理。

# 上报关联的维度

我们都知道在做前端的数据采集的时候,维度数据是非常重要的,除了我们刚才定义的各种度量,怎样采集到合适的相关维度,也能够极大地帮助我们分析页面性能的效果。

在分析页面性能的时候,有很多相对专业的维度是会被大家忽略掉的,比如说当前页面是否可见,这个页面加载方式是怎么样的,它是直接打开,还是刷新打开,还是前进后退打开等等。就是通过后面的数据分析,我们会发现,不同的页面操作,页面打开方式都会对我们页面加载的性能会有影响,以及一些更复杂的,比如说是否启用 HTTP2、Service Worker 等等,这些数据我们都应该尽可能采集到,从而能够更好的去分析我们的页面性能。

# 原文

本文为蚂蚁金服如何把前端性能监控做到极致? 的阅读笔记。

拓展阅读 我理解的前端性能 & 优化

上次更新: 11/14/2019, 3:15:12 AM